/**
 * 顺序表的动态分配
 */
#include <stdio.h>
#include <malloc.h>

#define InitSize 10  // 顺序表初始长度

// 定义顺序表
typedef struct {
    int *data;  // 指示动态分配数组的指针
    int MaxSize;    // 顺序表的最大容量
    int length;     // 顺序表当前长度
} SqList;

/* 初始化顺序表 */
void InitList(SqList *L) {
    // 申请连续的存储空间
    L->data = (int *) malloc(sizeof(int) * InitSize);
    L->length = 0;  // 初始长度为0
    L->MaxSize = InitSize;
}

/**
 * 向指定索引位置插入元素
 * @param L 顺序表
 * @param i 索引
 * @param e 元素
 */
void ListInsert(SqList *L, int i, int e) {
    // 判断空间是否已满
    if (L->MaxSize == L->length) {
        printf("顺序表已满!");
        return;
    }
    // 判断索引位置是否合理
    if (i < 0 || i >= L->MaxSize) {
        printf("索引不合法!");
        return;
    }
    // 先将第i个元素及其后面的元素后移一位
    for (int j = L->length; j > i; j--) {
        printf("%d %d %d", L->length, L->data[j], L->data[j - 1]);
        L->data[j] = L->data[j - 1];
    }
    // 将元素插入指定索引
    L->data[i] = e;
    // 表长度+1
    L->length++;
}


/**
 * 增加动态数组的长度
 * @param L
 * @param len
 */
void IncreaseSize(SqList *L, int len) {
    int *p = L->data;   // 指针p指向存储空间
    L->data = (int *) malloc((L->MaxSize + len) * sizeof(int));     // 申请新的存储空间 长度为原来的长度加上len的长度
    for (int i = 0; i < L->length; i++) {
        L->data[i] = p[i];  // 复制原来存储空间的值
    }
    L->MaxSize = L->MaxSize + len;  // 最大长度增加
    free(p);    // 释放原来的存储空间
}


int main() {
    SqList L;       // 声明顺序表
    InitList(&L);   // 初始化顺序表
    // 插入元素
    ListInsert(&L, 0, 1);
    ListInsert(&L, 0, 2);
    IncreaseSize(&L, 10);   // 增加顺序表大小
    return 0;
}